Allow select * from *
authorJeroen van der Heijden <jeroen@transceptor.technology>
Fri, 30 Mar 2018 20:17:57 +0000 (22:17 +0200)
committerJeroen van der Heijden <jeroen@transceptor.technology>
Fri, 30 Mar 2018 20:17:57 +0000 (22:17 +0200)
grammar/gogrammar/grammar.go
grammar/grammar.py
include/siri/grammar/grammar.h
src/siri/db/aggregate.c
src/siri/grammar/grammar.c
src/siri/parser/listener.c

index f33b4cc459aa49746922feb6d0867bc73458e22c..89053c28cf7767e4702a16443dd4a314b550b708 100644 (file)
@@ -4,7 +4,7 @@ package grammar
 // should be used with the goleri module.
 //
 // Source class: SiriGrammar
-// Created at: 2018-03-30 13:58:06
+// Created at: 2018-03-30 21:57:58
 
 import (
        "regexp"
@@ -51,6 +51,7 @@ const (
        GidDropShards = iota
        GidDropStmt = iota
        GidDropUser = iota
+       GidFAll = iota
        GidFCount = iota
        GidFDerivative = iota
        GidFDifference = iota
@@ -119,6 +120,7 @@ const (
        GidKActiveHandles = iota
        GidKAddress = iota
        GidKAfter = iota
+       GidKAll = iota
        GidKAlter = iota
        GidKAnd = iota
        GidKAs = iota
@@ -263,6 +265,7 @@ const (
        GidSelectAggregate = iota
        GidSelectAggregates = iota
        GidSelectStmt = iota
+       GidSeriesAll = iota
        GidSeriesColumns = iota
        GidSeriesMatch = iota
        GidSeriesName = iota
@@ -314,6 +317,7 @@ func SiriGrammar() *goleri.Grammar {
        kActiveHandles := goleri.NewKeyword(GidKActiveHandles, "active_handles", false)
        kAddress := goleri.NewKeyword(GidKAddress, "address", false)
        kAfter := goleri.NewKeyword(GidKAfter, "after", false)
+       kAll := goleri.NewKeyword(GidKAll, "all", false)
        kAlter := goleri.NewKeyword(GidKAlter, "alter", false)
        kAnd := goleri.NewKeyword(GidKAnd, "and", false)
        kAs := goleri.NewKeyword(GidKAs, "as", false)
@@ -935,6 +939,12 @@ func SiriGrammar() *goleri.Grammar {
                kIntersection,
                kSymmetricDifference,
        )
+       seriesAll := goleri.NewChoice(
+               GidSeriesAll,
+               false,
+               goleri.NewToken(NoGid, "*"),
+               kAll,
+       )
        seriesName := goleri.NewRepeat(GidSeriesName, string, 1, 1)
        groupName := goleri.NewRepeat(GidGroupName, rGraveStr, 1, 1)
        seriesRe := goleri.NewRepeat(GidSeriesRe, rRegex, 1, 1)
@@ -948,6 +958,7 @@ func SiriGrammar() *goleri.Grammar {
        seriesMatch := goleri.NewList(GidSeriesMatch, goleri.NewChoice(
                NoGid,
                false,
+               seriesAll,
                seriesName,
                groupMatch,
                seriesRe,
@@ -985,12 +996,13 @@ func SiriGrammar() *goleri.Grammar {
                kSuffix,
                string,
        )
-       fPoints := goleri.NewChoice(
-               GidFPoints,
+       fAll := goleri.NewChoice(
+               GidFAll,
                false,
                goleri.NewToken(NoGid, "*"),
-               kPoints,
+               kAll,
        )
+       fPoints := goleri.NewRepeat(GidFPoints, kPoints, 1, 1)
        fDifference := goleri.NewSequence(
                GidFDifference,
                kDifference,
@@ -1138,7 +1150,7 @@ func SiriGrammar() *goleri.Grammar {
        aggregateFunctions := goleri.NewList(GidAggregateFunctions, goleri.NewChoice(
                NoGid,
                false,
-               fPoints,
+               fAll,
                fLimit,
                fMean,
                fSum,
@@ -1156,6 +1168,7 @@ func SiriGrammar() *goleri.Grammar {
                fDifference,
                fDerivative,
                fFilter,
+               fPoints,
        ), goleri.NewToken(NoGid, "=>"), 1, 0, false)
        selectAggregate := goleri.NewSequence(
                GidSelectAggregate,
@@ -1593,53 +1606,65 @@ func SiriGrammar() *goleri.Grammar {
                ), goleri.NewToken(NoGid, ","), 0, 0, false),
        )
        timeitStmt := goleri.NewRepeat(GidTimeitStmt, kTimeit, 1, 1)
-       helpShow := goleri.NewKeyword(GidHelpShow, "show", false)
-       helpNoaccess := goleri.NewKeyword(GidHelpNoaccess, "noaccess", false)
+       helpSelect := goleri.NewKeyword(GidHelpSelect, "select", false)
+       helpListGroups := goleri.NewKeyword(GidHelpListGroups, "groups", false)
+       helpListPools := goleri.NewKeyword(GidHelpListPools, "pools", false)
+       helpListShards := goleri.NewKeyword(GidHelpListShards, "shards", false)
+       helpListUsers := goleri.NewKeyword(GidHelpListUsers, "users", false)
+       helpListServers := goleri.NewKeyword(GidHelpListServers, "servers", false)
+       helpListSeries := goleri.NewKeyword(GidHelpListSeries, "series", false)
+       helpList := goleri.NewSequence(
+               GidHelpList,
+               kList,
+               goleri.NewOptional(NoGid, goleri.NewChoice(
+                       NoGid,
+                       true,
+                       helpListGroups,
+                       helpListPools,
+                       helpListShards,
+                       helpListUsers,
+                       helpListServers,
+                       helpListSeries,
+               )),
+       )
+       helpAccess := goleri.NewKeyword(GidHelpAccess, "access", false)
        helpRevoke := goleri.NewKeyword(GidHelpRevoke, "revoke", false)
-       helpDropUser := goleri.NewKeyword(GidHelpDropUser, "user", false)
        helpDropGroup := goleri.NewKeyword(GidHelpDropGroup, "group", false)
+       helpDropSeries := goleri.NewKeyword(GidHelpDropSeries, "series", false)
+       helpDropUser := goleri.NewKeyword(GidHelpDropUser, "user", false)
        helpDropServer := goleri.NewKeyword(GidHelpDropServer, "server", false)
        helpDropShards := goleri.NewKeyword(GidHelpDropShards, "shards", false)
-       helpDropSeries := goleri.NewKeyword(GidHelpDropSeries, "series", false)
        helpDrop := goleri.NewSequence(
                GidHelpDrop,
                kDrop,
                goleri.NewOptional(NoGid, goleri.NewChoice(
                        NoGid,
                        true,
-                       helpDropUser,
                        helpDropGroup,
+                       helpDropSeries,
+                       helpDropUser,
                        helpDropServer,
                        helpDropShards,
-                       helpDropSeries,
                )),
        )
-       helpAlterUser := goleri.NewKeyword(GidHelpAlterUser, "user", false)
-       helpAlterServers := goleri.NewKeyword(GidHelpAlterServers, "servers", false)
-       helpAlterDatabase := goleri.NewKeyword(GidHelpAlterDatabase, "database", false)
-       helpAlterGroup := goleri.NewKeyword(GidHelpAlterGroup, "group", false)
-       helpAlterServer := goleri.NewKeyword(GidHelpAlterServer, "server", false)
-       helpAlter := goleri.NewSequence(
-               GidHelpAlter,
-               kAlter,
+       helpCreateUser := goleri.NewKeyword(GidHelpCreateUser, "user", false)
+       helpCreateGroup := goleri.NewKeyword(GidHelpCreateGroup, "group", false)
+       helpCreate := goleri.NewSequence(
+               GidHelpCreate,
+               kCreate,
                goleri.NewOptional(NoGid, goleri.NewChoice(
                        NoGid,
                        true,
-                       helpAlterUser,
-                       helpAlterServers,
-                       helpAlterDatabase,
-                       helpAlterGroup,
-                       helpAlterServer,
+                       helpCreateUser,
+                       helpCreateGroup,
                )),
        )
-       helpSelect := goleri.NewKeyword(GidHelpSelect, "select", false)
-       helpTimezones := goleri.NewKeyword(GidHelpTimezones, "timezones", false)
        helpCountGroups := goleri.NewKeyword(GidHelpCountGroups, "groups", false)
        helpCountPools := goleri.NewKeyword(GidHelpCountPools, "pools", false)
-       helpCountSeries := goleri.NewKeyword(GidHelpCountSeries, "series", false)
+       helpCountShards := goleri.NewKeyword(GidHelpCountShards, "shards", false)
        helpCountUsers := goleri.NewKeyword(GidHelpCountUsers, "users", false)
        helpCountServers := goleri.NewKeyword(GidHelpCountServers, "servers", false)
-       helpCountShards := goleri.NewKeyword(GidHelpCountShards, "shards", false)
+       helpCountSeries := goleri.NewKeyword(GidHelpCountSeries, "series", false)
        helpCount := goleri.NewSequence(
                GidHelpCount,
                kCount,
@@ -1648,68 +1673,56 @@ func SiriGrammar() *goleri.Grammar {
                        true,
                        helpCountGroups,
                        helpCountPools,
-                       helpCountSeries,
+                       helpCountShards,
                        helpCountUsers,
                        helpCountServers,
-                       helpCountShards,
+                       helpCountSeries,
                )),
        )
-       helpFunctions := goleri.NewKeyword(GidHelpFunctions, "functions", false)
-       helpCreateUser := goleri.NewKeyword(GidHelpCreateUser, "user", false)
-       helpCreateGroup := goleri.NewKeyword(GidHelpCreateGroup, "group", false)
-       helpCreate := goleri.NewSequence(
-               GidHelpCreate,
-               kCreate,
+       helpNoaccess := goleri.NewKeyword(GidHelpNoaccess, "noaccess", false)
+       helpAlterServer := goleri.NewKeyword(GidHelpAlterServer, "server", false)
+       helpAlterDatabase := goleri.NewKeyword(GidHelpAlterDatabase, "database", false)
+       helpAlterGroup := goleri.NewKeyword(GidHelpAlterGroup, "group", false)
+       helpAlterServers := goleri.NewKeyword(GidHelpAlterServers, "servers", false)
+       helpAlterUser := goleri.NewKeyword(GidHelpAlterUser, "user", false)
+       helpAlter := goleri.NewSequence(
+               GidHelpAlter,
+               kAlter,
                goleri.NewOptional(NoGid, goleri.NewChoice(
                        NoGid,
                        true,
-                       helpCreateUser,
-                       helpCreateGroup,
+                       helpAlterServer,
+                       helpAlterDatabase,
+                       helpAlterGroup,
+                       helpAlterServers,
+                       helpAlterUser,
                )),
        )
-       helpGrant := goleri.NewKeyword(GidHelpGrant, "grant", false)
+       helpShow := goleri.NewKeyword(GidHelpShow, "show", false)
+       helpTimezones := goleri.NewKeyword(GidHelpTimezones, "timezones", false)
        helpTimeit := goleri.NewKeyword(GidHelpTimeit, "timeit", false)
-       helpAccess := goleri.NewKeyword(GidHelpAccess, "access", false)
-       helpListSeries := goleri.NewKeyword(GidHelpListSeries, "series", false)
-       helpListServers := goleri.NewKeyword(GidHelpListServers, "servers", false)
-       helpListPools := goleri.NewKeyword(GidHelpListPools, "pools", false)
-       helpListUsers := goleri.NewKeyword(GidHelpListUsers, "users", false)
-       helpListGroups := goleri.NewKeyword(GidHelpListGroups, "groups", false)
-       helpListShards := goleri.NewKeyword(GidHelpListShards, "shards", false)
-       helpList := goleri.NewSequence(
-               GidHelpList,
-               kList,
-               goleri.NewOptional(NoGid, goleri.NewChoice(
-                       NoGid,
-                       true,
-                       helpListSeries,
-                       helpListServers,
-                       helpListPools,
-                       helpListUsers,
-                       helpListGroups,
-                       helpListShards,
-               )),
-       )
+       helpGrant := goleri.NewKeyword(GidHelpGrant, "grant", false)
+       helpFunctions := goleri.NewKeyword(GidHelpFunctions, "functions", false)
        help := goleri.NewSequence(
                GidHelp,
                kHelp,
                goleri.NewOptional(NoGid, goleri.NewChoice(
                        NoGid,
                        true,
-                       helpShow,
-                       helpNoaccess,
+                       helpSelect,
+                       helpList,
+                       helpAccess,
                        helpRevoke,
                        helpDrop,
+                       helpCreate,
+                       helpCount,
+                       helpNoaccess,
                        helpAlter,
-                       helpSelect,
+                       helpShow,
                        helpTimezones,
-                       helpCount,
-                       helpFunctions,
-                       helpCreate,
-                       helpGrant,
                        helpTimeit,
-                       helpAccess,
-                       helpList,
+                       helpGrant,
+                       helpFunctions,
                )),
        )
        START := goleri.NewSequence(
index 2660cd0d39edcd96b7971ba0559393be0836764f..8edc7c3e6fb8da8f41879b9ccf82c06d83c5b2c2 100644 (file)
@@ -48,6 +48,7 @@ class SiriGrammar(Grammar):
     k_active_handles = Keyword('active_handles')
     k_address = Keyword('address')
     k_after = Keyword('after')
+    k_all = Keyword('all')
     k_alter = Keyword('alter')
     k_and = Keyword('and')
     k_as = Keyword('as')
@@ -397,14 +398,21 @@ class SiriGrammar(Grammar):
         k_symmetric_difference,
         most_greedy=False)
 
+    series_all = Choice(Token('*'), k_all, most_greedy=False)
     series_name = Repeat(string, 1, 1)
     group_name = Repeat(r_grave_str, 1, 1)
     series_re = Repeat(r_regex, 1, 1)
     uuid = Choice(r_uuid_str, string, most_greedy=False)
     group_match = Repeat(r_grave_str, 1, 1)
     series_match = List(
-        Choice(Token('*'), series_name, group_match, series_re, most_greedy=False),
-        series_sep, 1)
+        Choice(
+            series_all,
+            series_name,
+            group_match,
+            series_re,
+            most_greedy=False),
+        series_sep,
+        1)
     limit_expr = Sequence(k_limit, int_expr)
 
     before_expr = Sequence(k_before, time_expr)
@@ -415,10 +423,9 @@ class SiriGrammar(Grammar):
     prefix_expr = Sequence(k_prefix, string)
     suffix_expr = Sequence(k_suffix, string)
 
-    f_points = Choice(
-        Token('*'),
-        k_points,
-        most_greedy=False)
+    f_all = Choice(Token('*'), k_all, most_greedy=False)
+
+    f_points = Repeat(k_points, 1, 1)  # DEPRECATED
 
     f_difference = Sequence(
         k_difference,
@@ -503,7 +510,7 @@ class SiriGrammar(Grammar):
         ')')
 
     aggregate_functions = List(Choice(
-        f_points,
+        f_all,
         f_limit,
         f_mean,
         f_sum,
@@ -521,6 +528,7 @@ class SiriGrammar(Grammar):
         f_difference,
         f_derivative,
         f_filter,
+        f_points,
         most_greedy=False), '=>', 1)
 
     select_aggregate = Sequence(
index 0a97a1cedbc22264ed90d5d9dccc162ae3bdd999..2b7471107b34a6556f5d7cd82ffc8411590a5c4a 100644 (file)
@@ -5,7 +5,7 @@
  * should be used with the libcleri module.
  *
  * Source class: SiriGrammar
- * Created at: 2018-03-30 13:58:06
+ * Created at: 2018-03-30 21:57:58
  */
 #ifndef CLERI_EXPORT_SIRI_GRAMMAR_GRAMMAR_H_
 #define CLERI_EXPORT_SIRI_GRAMMAR_GRAMMAR_H_
@@ -51,6 +51,7 @@ enum cleri_grammar_ids {
     CLERI_GID_DROP_SHARDS,
     CLERI_GID_DROP_STMT,
     CLERI_GID_DROP_USER,
+    CLERI_GID_F_ALL,
     CLERI_GID_F_COUNT,
     CLERI_GID_F_DERIVATIVE,
     CLERI_GID_F_DIFFERENCE,
@@ -119,6 +120,7 @@ enum cleri_grammar_ids {
     CLERI_GID_K_ACTIVE_HANDLES,
     CLERI_GID_K_ADDRESS,
     CLERI_GID_K_AFTER,
+    CLERI_GID_K_ALL,
     CLERI_GID_K_ALTER,
     CLERI_GID_K_AND,
     CLERI_GID_K_AS,
@@ -262,6 +264,7 @@ enum cleri_grammar_ids {
     CLERI_GID_SELECT_AGGREGATE,
     CLERI_GID_SELECT_AGGREGATES,
     CLERI_GID_SELECT_STMT,
+    CLERI_GID_SERIES_ALL,
     CLERI_GID_SERIES_COLUMNS,
     CLERI_GID_SERIES_MATCH,
     CLERI_GID_SERIES_NAME,
index 6200360753f46a4c1f77c892e0aaf25565169f01..25b1f1819bb18068bd844a015c1e65988f68ef7d 100644 (file)
@@ -423,7 +423,12 @@ slist_t * siridb_aggregate_list(cleri_children_t * children, char * err_msg)
 
             break;
 
+        case CLERI_GID_F_ALL:
+            break;
+
         case CLERI_GID_F_POINTS:
+            log_warning("Keyword 'points' is deprecated, "
+                        "use '*' or 'all' instead.");
             break;
 
         default:
index fbd7c80ab050b5aafd2a1b2b58e937fbfecf4bf6..f7e88b223838f1e9a742f2e443ee47572e554e07 100644 (file)
@@ -5,7 +5,7 @@
  * should be used with the libcleri module.
  *
  * Source class: SiriGrammar
- * Created at: 2018-03-30 13:58:06
+ * Created at: 2018-03-30 21:57:58
  */
 
 #include "siri/grammar/grammar.h"
@@ -33,6 +33,7 @@ cleri_grammar_t * compile_grammar(void)
     cleri_t * k_active_handles = cleri_keyword(CLERI_GID_K_ACTIVE_HANDLES, "active_handles", CLERI_CASE_SENSITIVE);
     cleri_t * k_address = cleri_keyword(CLERI_GID_K_ADDRESS, "address", CLERI_CASE_SENSITIVE);
     cleri_t * k_after = cleri_keyword(CLERI_GID_K_AFTER, "after", CLERI_CASE_SENSITIVE);
+    cleri_t * k_all = cleri_keyword(CLERI_GID_K_ALL, "all", CLERI_CASE_SENSITIVE);
     cleri_t * k_alter = cleri_keyword(CLERI_GID_K_ALTER, "alter", CLERI_CASE_SENSITIVE);
     cleri_t * k_and = cleri_keyword(CLERI_GID_K_AND, "and", CLERI_CASE_SENSITIVE);
     cleri_t * k_as = cleri_keyword(CLERI_GID_K_AS, "as", CLERI_CASE_SENSITIVE);
@@ -733,6 +734,13 @@ cleri_grammar_t * compile_grammar(void)
         k_intersection,
         k_symmetric_difference
     );
+    cleri_t * series_all = cleri_choice(
+        CLERI_GID_SERIES_ALL,
+        CLERI_FIRST_MATCH,
+        2,
+        cleri_token(CLERI_NONE, "*"),
+        k_all
+    );
     cleri_t * series_name = cleri_dup(CLERI_GID_SERIES_NAME, string);
     cleri_t * group_name = cleri_dup(CLERI_GID_GROUP_NAME, r_grave_str);
     cleri_t * series_re = cleri_dup(CLERI_GID_SERIES_RE, r_regex);
@@ -747,7 +755,8 @@ cleri_grammar_t * compile_grammar(void)
     cleri_t * series_match = cleri_list(CLERI_GID_SERIES_MATCH, cleri_choice(
         CLERI_NONE,
         CLERI_FIRST_MATCH,
-        3,
+        4,
+        series_all,
         series_name,
         group_match,
         series_re
@@ -791,13 +800,14 @@ cleri_grammar_t * compile_grammar(void)
         k_suffix,
         string
     );
-    cleri_t * f_points = cleri_choice(
-        CLERI_GID_F_POINTS,
+    cleri_t * f_all = cleri_choice(
+        CLERI_GID_F_ALL,
         CLERI_FIRST_MATCH,
         2,
         cleri_token(CLERI_NONE, "*"),
-        k_points
+        k_all
     );
+    cleri_t * f_points = cleri_dup(CLERI_GID_F_POINTS, k_points);
     cleri_t * f_difference = cleri_sequence(
         CLERI_GID_F_DIFFERENCE,
         4,
@@ -964,8 +974,8 @@ cleri_grammar_t * compile_grammar(void)
     cleri_t * aggregate_functions = cleri_list(CLERI_GID_AGGREGATE_FUNCTIONS, cleri_choice(
         CLERI_NONE,
         CLERI_FIRST_MATCH,
-        18,
-        f_points,
+        19,
+        f_all,
         f_limit,
         f_mean,
         f_sum,
@@ -982,7 +992,8 @@ cleri_grammar_t * compile_grammar(void)
         f_last,
         f_difference,
         f_derivative,
-        f_filter
+        f_filter,
+        f_points
     ), cleri_token(CLERI_NONE, "=>"), 1, 0, 0);
     cleri_t * select_aggregate = cleri_sequence(
         CLERI_GID_SELECT_AGGREGATE,
@@ -1487,14 +1498,36 @@ cleri_grammar_t * compile_grammar(void)
         ), cleri_token(CLERI_NONE, ","), 0, 0, 0)
     );
     cleri_t * timeit_stmt = cleri_dup(CLERI_GID_TIMEIT_STMT, k_timeit);
-    cleri_t * help_show = cleri_keyword(CLERI_GID_HELP_SHOW, "show", CLERI_CASE_SENSITIVE);
-    cleri_t * help_noaccess = cleri_keyword(CLERI_GID_HELP_NOACCESS, "noaccess", CLERI_CASE_SENSITIVE);
+    cleri_t * help_select = cleri_keyword(CLERI_GID_HELP_SELECT, "select", CLERI_CASE_SENSITIVE);
+    cleri_t * help_list_groups = cleri_keyword(CLERI_GID_HELP_LIST_GROUPS, "groups", CLERI_CASE_SENSITIVE);
+    cleri_t * help_list_pools = cleri_keyword(CLERI_GID_HELP_LIST_POOLS, "pools", CLERI_CASE_SENSITIVE);
+    cleri_t * help_list_shards = cleri_keyword(CLERI_GID_HELP_LIST_SHARDS, "shards", CLERI_CASE_SENSITIVE);
+    cleri_t * help_list_users = cleri_keyword(CLERI_GID_HELP_LIST_USERS, "users", CLERI_CASE_SENSITIVE);
+    cleri_t * help_list_servers = cleri_keyword(CLERI_GID_HELP_LIST_SERVERS, "servers", CLERI_CASE_SENSITIVE);
+    cleri_t * help_list_series = cleri_keyword(CLERI_GID_HELP_LIST_SERIES, "series", CLERI_CASE_SENSITIVE);
+    cleri_t * help_list = cleri_sequence(
+        CLERI_GID_HELP_LIST,
+        2,
+        k_list,
+        cleri_optional(CLERI_NONE, cleri_choice(
+            CLERI_NONE,
+            CLERI_MOST_GREEDY,
+            6,
+            help_list_groups,
+            help_list_pools,
+            help_list_shards,
+            help_list_users,
+            help_list_servers,
+            help_list_series
+        ))
+    );
+    cleri_t * help_access = cleri_keyword(CLERI_GID_HELP_ACCESS, "access", CLERI_CASE_SENSITIVE);
     cleri_t * help_revoke = cleri_keyword(CLERI_GID_HELP_REVOKE, "revoke", CLERI_CASE_SENSITIVE);
-    cleri_t * help_drop_user = cleri_keyword(CLERI_GID_HELP_DROP_USER, "user", CLERI_CASE_SENSITIVE);
     cleri_t * help_drop_group = cleri_keyword(CLERI_GID_HELP_DROP_GROUP, "group", CLERI_CASE_SENSITIVE);
+    cleri_t * help_drop_series = cleri_keyword(CLERI_GID_HELP_DROP_SERIES, "series", CLERI_CASE_SENSITIVE);
+    cleri_t * help_drop_user = cleri_keyword(CLERI_GID_HELP_DROP_USER, "user", CLERI_CASE_SENSITIVE);
     cleri_t * help_drop_server = cleri_keyword(CLERI_GID_HELP_DROP_SERVER, "server", CLERI_CASE_SENSITIVE);
     cleri_t * help_drop_shards = cleri_keyword(CLERI_GID_HELP_DROP_SHARDS, "shards", CLERI_CASE_SENSITIVE);
-    cleri_t * help_drop_series = cleri_keyword(CLERI_GID_HELP_DROP_SERIES, "series", CLERI_CASE_SENSITIVE);
     cleri_t * help_drop = cleri_sequence(
         CLERI_GID_HELP_DROP,
         2,
@@ -1503,41 +1536,33 @@ cleri_grammar_t * compile_grammar(void)
             CLERI_NONE,
             CLERI_MOST_GREEDY,
             5,
-            help_drop_user,
             help_drop_group,
+            help_drop_series,
+            help_drop_user,
             help_drop_server,
-            help_drop_shards,
-            help_drop_series
+            help_drop_shards
         ))
     );
-    cleri_t * help_alter_user = cleri_keyword(CLERI_GID_HELP_ALTER_USER, "user", CLERI_CASE_SENSITIVE);
-    cleri_t * help_alter_servers = cleri_keyword(CLERI_GID_HELP_ALTER_SERVERS, "servers", CLERI_CASE_SENSITIVE);
-    cleri_t * help_alter_database = cleri_keyword(CLERI_GID_HELP_ALTER_DATABASE, "database", CLERI_CASE_SENSITIVE);
-    cleri_t * help_alter_group = cleri_keyword(CLERI_GID_HELP_ALTER_GROUP, "group", CLERI_CASE_SENSITIVE);
-    cleri_t * help_alter_server = cleri_keyword(CLERI_GID_HELP_ALTER_SERVER, "server", CLERI_CASE_SENSITIVE);
-    cleri_t * help_alter = cleri_sequence(
-        CLERI_GID_HELP_ALTER,
+    cleri_t * help_create_user = cleri_keyword(CLERI_GID_HELP_CREATE_USER, "user", CLERI_CASE_SENSITIVE);
+    cleri_t * help_create_group = cleri_keyword(CLERI_GID_HELP_CREATE_GROUP, "group", CLERI_CASE_SENSITIVE);
+    cleri_t * help_create = cleri_sequence(
+        CLERI_GID_HELP_CREATE,
         2,
-        k_alter,
+        k_create,
         cleri_optional(CLERI_NONE, cleri_choice(
             CLERI_NONE,
             CLERI_MOST_GREEDY,
-            5,
-            help_alter_user,
-            help_alter_servers,
-            help_alter_database,
-            help_alter_group,
-            help_alter_server
+            2,
+            help_create_user,
+            help_create_group
         ))
     );
-    cleri_t * help_select = cleri_keyword(CLERI_GID_HELP_SELECT, "select", CLERI_CASE_SENSITIVE);
-    cleri_t * help_timezones = cleri_keyword(CLERI_GID_HELP_TIMEZONES, "timezones", CLERI_CASE_SENSITIVE);
     cleri_t * help_count_groups = cleri_keyword(CLERI_GID_HELP_COUNT_GROUPS, "groups", CLERI_CASE_SENSITIVE);
     cleri_t * help_count_pools = cleri_keyword(CLERI_GID_HELP_COUNT_POOLS, "pools", CLERI_CASE_SENSITIVE);
-    cleri_t * help_count_series = cleri_keyword(CLERI_GID_HELP_COUNT_SERIES, "series", CLERI_CASE_SENSITIVE);
+    cleri_t * help_count_shards = cleri_keyword(CLERI_GID_HELP_COUNT_SHARDS, "shards", CLERI_CASE_SENSITIVE);
     cleri_t * help_count_users = cleri_keyword(CLERI_GID_HELP_COUNT_USERS, "users", CLERI_CASE_SENSITIVE);
     cleri_t * help_count_servers = cleri_keyword(CLERI_GID_HELP_COUNT_SERVERS, "servers", CLERI_CASE_SENSITIVE);
-    cleri_t * help_count_shards = cleri_keyword(CLERI_GID_HELP_COUNT_SHARDS, "shards", CLERI_CASE_SENSITIVE);
+    cleri_t * help_count_series = cleri_keyword(CLERI_GID_HELP_COUNT_SERIES, "series", CLERI_CASE_SENSITIVE);
     cleri_t * help_count = cleri_sequence(
         CLERI_GID_HELP_COUNT,
         2,
@@ -1548,52 +1573,38 @@ cleri_grammar_t * compile_grammar(void)
             6,
             help_count_groups,
             help_count_pools,
-            help_count_series,
+            help_count_shards,
             help_count_users,
             help_count_servers,
-            help_count_shards
+            help_count_series
         ))
     );
-    cleri_t * help_functions = cleri_keyword(CLERI_GID_HELP_FUNCTIONS, "functions", CLERI_CASE_SENSITIVE);
-    cleri_t * help_create_user = cleri_keyword(CLERI_GID_HELP_CREATE_USER, "user", CLERI_CASE_SENSITIVE);
-    cleri_t * help_create_group = cleri_keyword(CLERI_GID_HELP_CREATE_GROUP, "group", CLERI_CASE_SENSITIVE);
-    cleri_t * help_create = cleri_sequence(
-        CLERI_GID_HELP_CREATE,
+    cleri_t * help_noaccess = cleri_keyword(CLERI_GID_HELP_NOACCESS, "noaccess", CLERI_CASE_SENSITIVE);
+    cleri_t * help_alter_server = cleri_keyword(CLERI_GID_HELP_ALTER_SERVER, "server", CLERI_CASE_SENSITIVE);
+    cleri_t * help_alter_database = cleri_keyword(CLERI_GID_HELP_ALTER_DATABASE, "database", CLERI_CASE_SENSITIVE);
+    cleri_t * help_alter_group = cleri_keyword(CLERI_GID_HELP_ALTER_GROUP, "group", CLERI_CASE_SENSITIVE);
+    cleri_t * help_alter_servers = cleri_keyword(CLERI_GID_HELP_ALTER_SERVERS, "servers", CLERI_CASE_SENSITIVE);
+    cleri_t * help_alter_user = cleri_keyword(CLERI_GID_HELP_ALTER_USER, "user", CLERI_CASE_SENSITIVE);
+    cleri_t * help_alter = cleri_sequence(
+        CLERI_GID_HELP_ALTER,
         2,
-        k_create,
+        k_alter,
         cleri_optional(CLERI_NONE, cleri_choice(
             CLERI_NONE,
             CLERI_MOST_GREEDY,
-            2,
-            help_create_user,
-            help_create_group
+            5,
+            help_alter_server,
+            help_alter_database,
+            help_alter_group,
+            help_alter_servers,
+            help_alter_user
         ))
     );
-    cleri_t * help_grant = cleri_keyword(CLERI_GID_HELP_GRANT, "grant", CLERI_CASE_SENSITIVE);
+    cleri_t * help_show = cleri_keyword(CLERI_GID_HELP_SHOW, "show", CLERI_CASE_SENSITIVE);
+    cleri_t * help_timezones = cleri_keyword(CLERI_GID_HELP_TIMEZONES, "timezones", CLERI_CASE_SENSITIVE);
     cleri_t * help_timeit = cleri_keyword(CLERI_GID_HELP_TIMEIT, "timeit", CLERI_CASE_SENSITIVE);
-    cleri_t * help_access = cleri_keyword(CLERI_GID_HELP_ACCESS, "access", CLERI_CASE_SENSITIVE);
-    cleri_t * help_list_series = cleri_keyword(CLERI_GID_HELP_LIST_SERIES, "series", CLERI_CASE_SENSITIVE);
-    cleri_t * help_list_servers = cleri_keyword(CLERI_GID_HELP_LIST_SERVERS, "servers", CLERI_CASE_SENSITIVE);
-    cleri_t * help_list_pools = cleri_keyword(CLERI_GID_HELP_LIST_POOLS, "pools", CLERI_CASE_SENSITIVE);
-    cleri_t * help_list_users = cleri_keyword(CLERI_GID_HELP_LIST_USERS, "users", CLERI_CASE_SENSITIVE);
-    cleri_t * help_list_groups = cleri_keyword(CLERI_GID_HELP_LIST_GROUPS, "groups", CLERI_CASE_SENSITIVE);
-    cleri_t * help_list_shards = cleri_keyword(CLERI_GID_HELP_LIST_SHARDS, "shards", CLERI_CASE_SENSITIVE);
-    cleri_t * help_list = cleri_sequence(
-        CLERI_GID_HELP_LIST,
-        2,
-        k_list,
-        cleri_optional(CLERI_NONE, cleri_choice(
-            CLERI_NONE,
-            CLERI_MOST_GREEDY,
-            6,
-            help_list_series,
-            help_list_servers,
-            help_list_pools,
-            help_list_users,
-            help_list_groups,
-            help_list_shards
-        ))
-    );
+    cleri_t * help_grant = cleri_keyword(CLERI_GID_HELP_GRANT, "grant", CLERI_CASE_SENSITIVE);
+    cleri_t * help_functions = cleri_keyword(CLERI_GID_HELP_FUNCTIONS, "functions", CLERI_CASE_SENSITIVE);
     cleri_t * help = cleri_sequence(
         CLERI_GID_HELP,
         2,
@@ -1602,20 +1613,20 @@ cleri_grammar_t * compile_grammar(void)
             CLERI_NONE,
             CLERI_MOST_GREEDY,
             14,
-            help_show,
-            help_noaccess,
+            help_select,
+            help_list,
+            help_access,
             help_revoke,
             help_drop,
+            help_create,
+            help_count,
+            help_noaccess,
             help_alter,
-            help_select,
+            help_show,
             help_timezones,
-            help_count,
-            help_functions,
-            help_create,
-            help_grant,
             help_timeit,
-            help_access,
-            help_list
+            help_grant,
+            help_functions
         ))
     );
     cleri_t * START = cleri_sequence(
index 3ea5f261ea48637ab2fea93b66c7cf055bc55d08..acdfd314f3cde84d38c671e4d9846c1c73904fdf 100644 (file)
@@ -1318,6 +1318,69 @@ static void enter_series_match(uv_async_t * handle)
     SIRIPARSER_NEXT_NODE
 }
 
+static void enter_series_all(uv_async_t * handle)
+{
+    siridb_query_t * query = (siridb_query_t *) handle->data;
+    siridb_t * siridb = ((sirinet_socket_t *) query->client->data)->siridb;
+    cleri_node_t * node = query->nodes->node;
+    query_wrapper_t * q_wrapper = (query_wrapper_t *) query->data;
+
+    /* we must send this query to all pools */
+    if (q_wrapper->pmap != NULL)
+    {
+        imap_free(q_wrapper->pmap, NULL);
+        q_wrapper->pmap = NULL;
+    }
+
+    if (q_wrapper->update_cb != NULL)
+    {
+        (*q_wrapper->update_cb)(
+                q_wrapper->series_map,
+                q_wrapper->series_tmp,
+                (imap_free_cb) &siridb__series_decref);
+    }
+    q_wrapper->series_tmp = NULL;
+
+        uv_mutex_lock(&siridb->series_mutex);
+
+        q_wrapper->slist = imap_2slist_ref(
+                (   q_wrapper->update_cb == NULL ||
+                    q_wrapper->update_cb == &imap_union_ref ||
+                    q_wrapper->update_cb == &imap_symmetric_difference_ref) ?
+                        siridb->series_map : q_wrapper->series_map);
+
+        uv_mutex_unlock(&siridb->series_mutex);
+
+        q_wrapper->series_tmp = (q_wrapper->update_cb == NULL) ?
+                q_wrapper->series_map : imap_new();
+
+        if (q_wrapper->slist == NULL || q_wrapper->series_tmp == NULL)
+        {
+            MEM_ERR_RET
+        }
+
+        uv_async_t * next =
+                (uv_async_t *) malloc(sizeof(uv_async_t));
+
+        if (next == NULL)
+        {
+            MEM_ERR_RET
+        }
+
+        next->data = handle->data;
+
+        uv_async_init(
+                siri.loop,
+                next,
+                (uv_async_cb) async_series_re);
+        uv_async_send(next);
+
+        uv_close((uv_handle_t *) handle, (uv_close_cb) free);
+    }
+
+    /* handle is handled or a signal is raised */
+}
+
 static void enter_series_re(uv_async_t * handle)
 {
     siridb_query_t * query = (siridb_query_t *) handle->data;
@@ -3228,8 +3291,6 @@ static void exit_series_match(uv_async_t * handle)
         q_select->points_map = imap_new();
     }
 
-    LOGC("exit series match %zu (%u)", q_select->nselects, q_select->flags);
-
     SIRIPARSER_ASYNC_NEXT_NODE
 }